Spring Boot ——devtools 热部署的几种方式(详细)

作者: 李多多 日期: 2019-06-10
Spring Boot
Spring Boot ——devtools 热部署的几种方式(详细)

(一)方法一

添加DevTools依赖:

image.png

pom依赖如下:

              <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional><!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 -->
</dependency>

当配置了 devtools 后,我们在classpath修改任何文件项目都将会自动重启。

当我们再次启动项目的时候,使用的加载器就变为了 restartedMain 了,说明热部署已经成功。

image.png

当然 IDEA默认是不会去帮你自动编译的,需要打开Settings,选择Compiler,开启自动编译。

image.png

然后Ctrl+Shift+Alt+/,选择Registry

image.png

compiler.automake.allow.when.app.running后面的勾也需要打上。

image.png

至此,IDEA中SpringBoot集成DevTools实现热部署也实现了。DevTools会监听classpath下的文件变动,并且会在保存文件时立即重启应用。但是这样实时跟进修改的会影响电脑性能,意义也不大,除非你的电脑配置高。

(二)方法二

还有一种方式可以跟进热部署,我们可以在application.properties中配置如下:

spring.devtools.restart.trigger-file=.trigger-file  //.trigger-file随便起的名字

在resources文件夹新建 .trigger-file 文件,然后每次当你想重新启动的时候,就去改动一下.trigger-file文件内容即可(内容可随意修改),修改完后项目就会自动重启,否则无论修改多少文件都不会重启,效率比较高点。

(三)全局配置

如果你的项目中有很多个spring boot模块,特别是做微服务的话,那么此时可以进行全局配置来控制自动重启的问题。如何解决呢?

先在系统用户目录下创建文件,命名为:**.spring-boot-devtools.properties**

image.png

打开文件写入: spring.devtools.restart.trigger-file=.trigger-file

image.png

和之前一样,resources文件夹下创建 .trigger-file文件,此处的.trigger-file要和刚才创建的文件内容一样,均使用.trigger-file

image.png

然后就可以了,重启项目,修改代码内容后在.trigger-file文件内输入内容后项目就会自动重启,原理和上面一样。

这个全局的配置对于当前电脑上任何使用devtools模块的spring boot项目都有效。

(四)禁用热部署(禁用自动重启)

如果使用过程中不想项目自动重启,并且还配置了devtools依赖不想删掉,怎么办呢?

只需在application.properties中添加一行配置即可,如下:

image.png

或者修改启动类的配置,如下图,和上面的原理一样,两种方式都行:

image.png

配置完后,重新启动项目,修改文件后,项目就不会自动重启了。

另外:

(1)某些资源在更改时不一定需要触发重新启动。例如, Thymeleaf 模板可以就地进行编辑。默认情况下更改资源路径包括了:/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或者 /templates 不会触发重新启动, 但会触发实时重新加载。

如果逆向排除这些路径,可以使用如下配置,也就是说以下的文件目录如果有改动将会触发重启:

spring.devtools.restart.exclude=classpath:/static/,public/

  (2)如果要保留这些默认值并添加其他排除项, 请使用 spring.devtools.restart.additional-exclude 属性代替。

  (3)通过 System.setProperty(“spring.devtools.restart.enabled”, “false”); 方法,可以在SpringApplication.run()方法运行天使用关闭 devtools。

注意点:devtools 由于是双类加载机制,再结合了通用Mapper后可能会出现 java.lang.ClassCastException 异常(例如:说class x.x.A cannot be cast to x.x.A。)。

  解决方案就如下:

  在 src/main/resources 中创建 META-INF 目录,在此目录下添加 spring-devtools.properties 配置,内容如下:

  restart.include.mapper=/mapper-[\\w-\\.]+jar
  restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar